﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Rotempco.BaseClass.DAL;
using Rotempco.BaseClass.Objects.EntityObjects;
using Rotempco.Core.Logic;

namespace Rotempco.BaseClass.Managers
{
    public class SiteAttributeStoreManager : SiteAttributeStoreData
    {
        public T GetByKey<T>(string keyName) where T : class
        {
            SiteAttributeStore siteAttributeStore = DataFactory.SiteAttributeStore.GetSingle(keyName: keyName);
            if (siteAttributeStore != null)
                return SerializerLogic.XmlDeserialize<T>(siteAttributeStore.Value);

            return null;
        }

        public T Get<T>() where T : class
        {
            string keyName = typeof(T).Name;

            SiteAttributeStore siteAttributeStore = DataFactory.SiteAttributeStore.GetSingle(keyName: keyName);

            if (siteAttributeStore != null)
                return SerializerLogic.XmlDeserialize<T>(siteAttributeStore.Value);

            return null;
        }

        public void WriteToDB<T>(T keyValueObject)
        {
            string keyName = typeof(T).Name;

            SiteAttributeStore siteAttributeStore = GetByKey(keyName);
            siteAttributeStore.Value = SerializerLogic.XmlSerialize<T>(keyValueObject);
            DataFactory.SiteAttributeStore.WriteToDB(siteAttributeStore);
        }



        public string GetStringByKey(string keyName)
        {
            return GetByType(keyName, typeof(String)) as String;
        }

        public void SetStringKey(string keyName, string value)
        {
            SiteAttributeStore siteAttributeStore = GetByKey(keyName);
            siteAttributeStore.Value = value.ToString();
            DataFactory.SiteAttributeStore.WriteToDB(siteAttributeStore);
        }


        public bool? GetBoolByKey(string keyName)
        {
            return GetByType(keyName, typeof(bool)) as bool?;
        }

        public void SetBoolKey(string keyName, bool value)
        {
            SetStringKey(keyName, value.ToString());
        }


        public int? GetIntByKey(string keyName)
        {
            return GetByType(keyName, typeof(int)) as int?;
        }

        public void SetIntKey(string keyName, int value)
        {
            SetStringKey(keyName, value.ToString());
        }



        private SiteAttributeStore GetByKey(string keyName)
        {
            SiteAttributeStore siteAttributeStore = null;

            siteAttributeStore = DataFactory.SiteAttributeStore.GetSingle(keyName: keyName);

            if (siteAttributeStore == null)
            {
                siteAttributeStore = new SiteAttributeStore();
                siteAttributeStore.KeyName = keyName;
            }
            return siteAttributeStore;
        }

        private object GetByType(string keyName, Type type)
        {
            SiteAttributeStore siteAttributeStore = DataFactory.SiteAttributeStore.GetSingle(keyName: keyName);

            string valueString = (siteAttributeStore == null ? string.Empty : siteAttributeStore.Value);

            if (string.IsNullOrEmpty(valueString))
                return null;

            if (type == typeof(String))
                return valueString;
            if (type == typeof(Int32))
                return Convert.ToInt32(valueString);
            else if (type == typeof(Boolean))
                return Convert.ToBoolean(valueString);
            else
                throw new NotImplementedException();
        }

        public void WriteToDB<T>(string keyName, T keyValueObject)
        {
            SiteAttributeStore siteAttributeStore = GetByKey(keyName);

            siteAttributeStore.Value = SerializerLogic.XmlSerialize<T>(keyValueObject);

            DataFactory.SiteAttributeStore.WriteToDB(siteAttributeStore);
        }
    }
}
